class Solution1 {
    public int minCost(int[][] costs) {
        int n = costs.length;
        // dp[i][0] 表示粉刷到 i 位置为红色的最小花费
        // dp[i][1] 表示粉刷到 i 位置为蓝色的最小花费
        // dp[i][2] 表示粉刷到 i 位置为绿色的最小花费
        int[][] dp = new int[n][3];
        // 初始化
        System.arraycopy(costs[0], 0, dp[0], 0, 3);
        // 填表
        for (int i = 1; i < n; i++) {
            dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + costs[i][0];
            dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + costs[i][1];
            dp[i][2] = Math.min(dp[i - 1][1], dp[i - 1][0]) + costs[i][2];
        }
        return Math.min(Math.min(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]);
    }

    public static void main(String[] args) {
        Solution1 solution1 = new Solution1();
        int[][] costs = new int[3][3];
        costs[0] = new int[]{17,2,17};
        costs[1] = new int[]{16,16,5};
        costs[2] = new int[]{14,3,19};
        System.out.println(solution1.minCost(costs));
    }
}